package Controlador.Controladores;

import Controlador.Interfaz.DataFuente;
import Controlador.Interfaz.DataVerResultados;
import com.mysql.jdbc.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;

/**
 *
 * @author luisramirezmartinez
 */
public class FuenteTabla extends Observable implements DataVerResultados {
    //Propiedades
    private FuenteConexion Fc=null;
    private String sqlcode="";
    private List<DataFuente> LstObservadores = new ArrayList();
    //Objetos Internos de la Clase
    private ResultSet Rs=null;
    private Connection conexion=null;
    
    //Constructores
    
    public FuenteTabla(){
    
    }
    //metodos
    public ResultSet Consultar(){
        try {
            
          if(conexion!=null) conexion.close();
           conexion= getFc().conectar();
           Rs= conexion.createStatement().executeQuery(getSqlcode());
           //Rs.next();
           this.setChanged();
           this.notifyObservers();
        } catch (SQLException ex) {
         
        }
         return(this.getRs());
    }
    
    public void Consultar(String Sql){
          try {
          if(conexion!=null) conexion.close();
           conexion= getFc().conectar();
           Rs= conexion.createStatement().executeQuery(Sql);
           Rs.next();
           this.setChanged();
           this.notifyObservers();
        } catch (SQLException ex) {
         
        }
    
    }
    
      public ResultSet ConsultarSE(String Sql){
          try {
          if(conexion!=null) conexion.close();
           conexion= getFc().conectar();
           Rs= conexion.createStatement().executeQuery(Sql);
           Rs.next();
        } catch (SQLException ex) {
         
        }
          return Rs;
    
    }
    
    public void Siguiente(){
        if(conexion==null) this.Consultar();
        try {
            if(!this.getRs().next()) this.getRs().last();
                this.setChanged();
                this.notifyObservers();
                
        } catch (SQLException ex) {
           
        }
    
    }
    
    public void Refrescar(){
        this.Consultar();
        try {
            if(!this.getRs().next()) this.getRs().last();
                this.setChanged();
                this.notifyObservers();
                
        } catch (SQLException ex) {
           
        }
    
    }
       public void Ultimo(){
        if(conexion==null) this.Consultar();
        try {
            if(!this.getRs().last()) this.getRs().last();
                this.setChanged();
                this.notifyObservers();
                
        } catch (SQLException ex) {
           
        }
    
    }
    
     public void Primero(){
        if(conexion==null) this.Consultar();
        try {
            if(!this.getRs().first()) this.getRs().first();
                this.setChanged();
                this.notifyObservers();
                
        } catch (SQLException ex) {
           
        }
    
    }
    public void Anterior(){
        if(conexion==null) this.Consultar();
        try {
            if(!this.getRs().previous()) this.getRs().first();
                this.setChanged();
                this.notifyObservers();
                
        } catch (SQLException ex) {
           
        }
    
    }
    
    public boolean Actualizar(String tbl){
    
        return true;
    }
       
    public boolean Guardar(String tbl){
        String insert="insert into "+tbl+" (";
        boolean ban=false;
        for (int i = 0; i < this.LstObservadores.size(); i++) {
            insert+= ban==false?this.LstObservadores.get(i).getCampo():", "+this.LstObservadores.get(i).getCampo(); 
            ban=true;
        }

            insert+=") values(";
        for (int i = 0; i < this.LstObservadores.size(); i++) {
            if(this.LstObservadores.get(i).getTipoSeleccionado().equals("Texto")){
                insert+=ban==true ? "'"+this.LstObservadores.get(i).getText()+"'":", '"+this.LstObservadores.get(i).getText()+"'";
                ban=false;
            }else if(this.LstObservadores.get(i).getTipoSeleccionado().equals("Boleano")){
                insert+=ban==true ? this.LstObservadores.get(i).getText():", "+this.LstObservadores.get(i).valor();
                ban=false;
            }else{
                insert+=ban==true ? this.LstObservadores.get(i).getText():", "+this.LstObservadores.get(i).getText();
                ban=false;
            }     
        }
        insert+=");";
        System.out.println(insert);
        if(conexion!=null)
            try {
                conexion.createStatement().execute(insert);
            } catch (SQLException ex) {
                return false;
            }
         else return false;
        
    return true;
    }
    
    public boolean Eliminar(String tbl){
        String delete ="delete from "+tbl +" where ";
         for (int i = 0; i < this.LstObservadores.size(); i++)  
             if(this.LstObservadores.get(i).isLlave()) {
                 delete=delete+" "+this.LstObservadores.get(i).getCampo()+" = ";
                         delete+=this.LstObservadores.get(i).getTipoSeleccionado().equals("Texto")?" '"+this.LstObservadores.get(i).getText()+"'; ":
                             " "+this.LstObservadores.get(i).getText()+"; ";
                         System.out.println(delete);
             }
         if(conexion!=null)
            try {
                conexion.createStatement().execute(delete);
            } catch (SQLException ex) {
                return false;
            }
         else return false;
        

    return true;
    }
    

    
    //Geters y Seters

    @Override
    public ResultSet getRs() {
       return(Rs);
    }

 
    public FuenteConexion getFc() {
        return Fc;
    }

 
    public void setFc(FuenteConexion Fc) {
        this.Fc = Fc;
    }

 
    public String getSqlcode() {
        return sqlcode;
    }


    public void setSqlcode(String sqlcode) {
        this.sqlcode = sqlcode;
    }
    
//    //Pruebas de Unidad
//    public static void main(String[] args) {
//        try {
//        FuenteConexion fuenteConexion = new FuenteConexion();
//        fuenteConexion.setUsuario("u164902_sami");
//        fuenteConexion.setPassword("#19$09LGSP-1a");
//        fuenteConexion.setBaseDatos("u164902_sami");
//        fuenteConexion.setIp("sw-sami.com:3306");
//
//            FuenteTabla fuenteTabla = new FuenteTabla();
//            fuenteTabla.setFc(fuenteConexion);
//            fuenteTabla.setSqlcode("select * from tbl_pais;");
//            System.out.println(
//            fuenteTabla.Consultar().getString(2));
//            
//        } catch (SQLException ex) {
//            Logger.getLogger(FuenteTabla.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }

    /**
     * @return the LstObservadores
     */
    public List<DataFuente> getLstObservadores() {
        return LstObservadores;
    }

    /**
     * @param LstObservadores the LstObservadores to set
     */
    public void setLstObservadores(List<DataFuente> LstObservadores) {
        this.LstObservadores = LstObservadores;
    }

}
